UNIT EXTDR;

{    ***********************************************
     *                                             *
     *             ACJ  -  ELETRONICA              *
     *                                             *
     *  PROCEDIMENTOS E FUNCOES PARA A  INTERFACE  *
     *  DO EXCITADOR PARA ELETRONEUROMIOGRAFIA.    *
     *                                             *
     *  Versao 1.0  -  Janeiro de 1990.            *
     *                                             *
     ***********************************************


     -----------------------------------------------

     Use o comando  ' USES EXTDR; '  no seu programa
     para incluir este arquivo durante a compilacao.
     Desta forma voce podera' ter acesso as  rotinas
     deste arquivo.

     -----------------------------------------------  }



INTERFACE

CONST  OK = 0;
       EXCT_ERRO = -1;

VAR   EXCT_ADR : INTEGER;
      PORT_VALOR : BYTE;

FUNCTION SET_EXCT(ADDR:INTEGER):INTEGER;

PROCEDURE WAIT_PULSO;

PROCEDURE SET_PERIODO(PERIODO:INTEGER);

PROCEDURE PULSO;

FUNCTION IN_PORT_2:INTEGER;

PROCEDURE OUT_PORT_2(VALOR:INTEGER);



IMPLEMENTATION

FUNCTION SET_EXCT(ADDR:INTEGER):INTEGER;

{  Esta funcao seta o endereco da interface para o
   excitador do eletro-neuromiografo.   O endereco
   (16 bits) e' armazenado na variavel EXCT_ADR. O
   endereco e' de $200 a $3E0  em  incrementos  de
   $20. Antes do excitador ser usado deve ser cha-
   mada esta funcao !!!  Isto e' importante,  pois
   as rotinas a seguir nao funcionam caso esta ro-
   tina nao seja chamada. Basta apenas uma  chamda
   de SET_EXCT. Nao e' necessario chama-la  sempre
   antes da chamada de  qualquer  uma  das  outras
   funcoes ou procedimentos abaixo.
   O parametro de SET_EXCT e' o endereco da placa.

   Exemplo :
   OK := SET_EXCT($200);

   Neste exemplo a placa esta ligada  no  endereco
   $200. O parametro retornado pela  funcao  e ' o
   valor OK (zero)  no  caso  de  nenhum  erro  ou
   EXCT_ERRO (-1) no caso de erro.  Estes  valores
   ja estao pre-definidos.
   Durante a inicializacao a  porta  de  saida  e'
   carregada com o valor $00.                        }

BEGIN
  IF (ADDR AND $FE1F) <> $200 THEN
      SET_EXCT := EXCT_ERRO
    ELSE
      BEGIN
        EXCT_ADR := ADDR;
        SET_EXCT := OK;
        PORT[EXCT_ADR] := 0;
        PORT_VALOR := 0;
      END;
END;


PROCEDURE WAIT_PULSO;

{  Este procedimento espera ate' que  a  placa  do
   excitador termine um pulso para  que  ela  seja
   reprogramada ou para o disparo de um outro pul-
   so.                                               }

BEGIN
  IF EXCT_ADR <> 0 THEN
  WHILE (PORT[EXCT_ADR] AND 8) = 0 DO;
END;



PROCEDURE SET_PERIODO(PERIODO:INTEGER);

{  Este procedimento programa a largura  do  pulso
   de excitacao. O pulso tem larguras de 50,  100,
   200, 500 e 1000 microsegundos,  e  correspondem
   aos valores de entrada do procedimento de 0, 1,
   2, 3 e 4, respectivamente. No caso de passar-se
   um valor maior que 4 como argumento,  a  rotina
   ira' assumir o valor 4. A rotina SET_EXCT  pro-
   grama a largura  de  50  microsegundos  para  o
   excitador durante a inicializacao.                }

BEGIN
  WAIT_PULSO;
  IF EXCT_ADR <> 0 THEN
    BEGIN
      IF PERIODO > 4 THEN PERIODO := 4;
      PORT_VALOR := (PORT_VALOR AND $F8) OR PERIODO;
      PORT[EXCT_ADR] := PORT_VALOR;
    END;
END;



PROCEDURE PULSO;

{  Este procedimento dispara um pulso  de  largura
   programada por SET_PERIODO.                       }

BEGIN
  WAIT_PULSO;
  IF EXCT_ADR <> 0 THEN
    BEGIN
      PORT[EXCT_ADR] := PORT_VALOR OR $8;
      PORT[EXCT_ADR] := PORT_VALOR AND $F7;
    END;
END;


FUNCTION IN_PORT_2:INTEGER;

{  Esta funcao le os tres bits que nao sao  usados
   da porta de entrada. Os bits sao lidos como uma
   segunda porta logica, ou porta 2. O formato dos
   dados de saida e' o seguinte :

   0 0 0 0 0 X X X
   7             0  -  bits

   Como as outras funcoes, esta nao ira' funcionar
   caso a interface nao esteja inicializada.         }

BEGIN
  IF EXCT_ADR <> 0 THEN
      IN_PORT_2 := PORT[EXCT_ADR] AND $07
    ELSE
      IN_PORT_2 := 0;
END;


PROCEDURE OUT_PORT_2(VALOR:INTEGER);

{  Este procedimento envia um valor para os quatro

   bits mais significativos da porta de saida. Es-
   ta e' tratada como duas  portas  logicas  de  4
   bits cada. A porta 2 nao e' usada pelo  excita-
   dor e esta' disponivel para outro uso. Os dados
   de entrada devem estar na faixa de 0 a 15 sendo
   que os bits 4 a 15 sao ignorados. Os bits de  0
   a 3 sao copiados para os bits 4 a 7 da porta de
   saida.                                            }

BEGIN
  IF EXCT_ADR <> 0 THEN
    BEGIN
      PORT_VALOR := (PORT_VALOR AND $0F) OR (16 * (VALOR AND $0F));
      PORT[EXCT_ADR] := PORT_VALOR;
    END;
END;



BEGIN              {INICIALIZACAO DA UNIDADE}
  EXCT_ADR := 0;
END.
